package com.coolw.spring.filter;

import com.coolw.spring.config.WebFilterConfig;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import java.io.IOException;

/**
 * 过滤器
 * <p>实现Filter接口
 * <pre>
 *      init：当容器启动初始化时调用，此方法在Filter整个生命周期只执行一次
 *      doFilter：请求被拦截的时候调用，每一次拦截都会执行一次
 *      destroy：当容器销毁时调用，此方法在Filter整个生命周期只执行一次
 * </pre>
 *
 * <p>实现原理：基于函数回调。实现Filter接口会实现doFilter方法，FilterChain参数它是一个回调接口，ApplicationFilterChain是它的实现类，
 * 该类中的doFilter方法就是回调方法。
 *
 * <p>过滤器使用范围：javax.servlet.Filter是Servlet包中的一个类，也就是说依赖于Tomcat等容器，所以过滤器只能在web程序中使用
 *
 * <p>过滤器触发时机：过滤器Filter是在请求进入容器后，但在进入Servlet之前进行预处理，请求结束是在Servlet处理完之后
 *
 * <p>过滤器生效方式
 * <pre>
 *      1.Filter实现类 + @WebFilter + @ServletComponentScan，可设置urlPatterns
 *      2.Filter实现类 + @Component，会注册一个urlpattern为 /* 的过滤器
 *      3.推荐使用：Filter实现类 + FilterRegistrationBean构造 + @Configuration，可设置urlPatterns，也可设置执行顺序Order。{@link WebFilterConfig}
 * </pre>
 *
 * <p>@WebFilter常用属性说明
 * <pre>
 *      1.urlPatterns：过滤器拦截的Url路径（支持通配符，例如/*，/api/*）
 *      2.filterName：过滤器名称
 *      3.initParams：初始化参数，配合@WebInitParam一起使用
 *      4.dispatcherTypes：过滤的请求类型（如 DispatcherType.REQUEST、DispatcherType.ASYNC）
 * </pre>
 *
 * @author coolw
 * @date 2025/5/12 19:22
 */
@Slf4j
//@WebFilter(filterName = "myFilter", urlPatterns = "/auth/*")
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("MyFilter init......");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter doFilter......");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        log.info("MyFilter destroy......");
    }
}
